import axios, { AxiosInstance, AxiosRequestConfig, AxiosResponse, InternalAxiosRequestConfig } from "@ohos/axios";

// axios 请求配置
const config = {
  baseURL: 'http://192.168.0.101:8080',
  // baseURL: '/api',
  timeout: 1000
}

// 定义返回值类型
export interface Result<T = any> {
  code: number;
  message: string;
  data: T;
}

class Http {
  // axios 实例
  private instance: AxiosInstance;

  // 构造函数初始化
  constructor(config: AxiosRequestConfig) {
    this.instance = axios.create(config);
    //定义拦截器
    this.interceptors();
  }

  private interceptors() {
    // axios 发送请求之前的处理
    this.instance.interceptors.request.use((config: InternalAxiosRequestConfig) => {
      //从  await preferencesUtil.putKey("TopFolder", "token", val);

      // 从 LocalStorage 中获取 Token
      const token =
        "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJjbGFpbXMiOnsicGFzc3dvcmQiOiI3ZmE4MjgyYWQ5MzA0N2E0ZDZmZTYxMTFjOTNiMzA4YSIsImFjY291bnQiOiIxMTExMTExMTExMSJ9LCJleHAiOjE3NDQyMDg1MDl9.POs3BhFuniRvPpewJnd7Pn81GquBAJjDrXpaYW3AHzI"
      if (token) {
        config.headers.Authorization = token;
      }
      console.log('' + config);
      return config;

    }, (error: any) => {
      error.data = {};
      error.data.msg = '服务器异常，请联系管理员！'
      return error;
    })
    // axios 请求返回之后的处理
    // 请求返回处理
    this.instance.interceptors.response.use((res: AxiosResponse) => {
      // console.log(res.data);
      // if (res.data.code != 1) {
      //   console.log(res.data.msg || '服务器出错啦');
      //   return Promise.reject(res.data.msg || '服务器出错啦');
      // } else {
      //   return res.data;
      // }
      return res.data;
    }, (error) => {
      console.log('进入错误！');
      error.data = {};
      if (error && error.response) {
        switch (error.response.status) {
          case 400:
            error.data.msg = "错误请求";
            console.log(error.data.msg);
            break;
          case 401:
            error.data.msg = "未授权，请登录";
            console.log(error.data.msg);
            break;
          case 403:
            error.data.msg = "拒绝访问";
            console.log(error.data.msg);
            break;
          case 404:
            error.data.msg = "请求错误，未找到该资源";
            console.log(error.data.msg);
            break;
          case 405:
            error.data.msg = "请求方法未允许";
            console.log(error.data.msg);
            break;
          case 408:
            error.data.msg = "请求超时";
            console.log(error.data.msg);
            break;
          case 500:
            error.data.msg = "服务器端出错";
            console.log(error.data.msg);
            break;
          case 501:
            error.data.msg = "网络未实现";
            console.log(error.data.msg);
            break;
          case 502:
            error.data.msg = "网络错误";
            console.log(error.data.msg);
            break;
          case 503:
            error.data.msg = "服务不可用";
            console.log(error.data.msg);
            break;
          case 504:
            error.data.msg = "网络超时";
            console.log(error.data.msg);
            break;
          case 505:
            error.data.msg = "http版本不支持该请求";
            console.log(error.data.msg);
            break;
          default:
            error.data.msg = `连接错误${error.response.status}`;
            console.log(error.data.msg);
        }
      } else {
        error.data.msg = "连接到服务器失败";
        console.log(error.data.msg)
      }
      return Promise.reject(error);
    })
  }

  // GET方法
  get<T = Result>(url: string, params?: object): Promise<T> {
    return this.instance.get(url, { params });
  }

  // POST方法
  post<T = Result>(url: string, data?: object): Promise<T> {
    return this.instance.post(url, data);
  }

  // PUT方法
  put<T = Result>(url: string, data?: object): Promise<T> {
    return this.instance.put(url, data);
  }

  // DELETE方法
  delete<T = Result>(url: string): Promise<T> {
    return this.instance.delete(url);
  }
}

export default new Http(config);

